prepare-root: Move /sysroot instead of unmounting it
authorColin Walters <walters@verbum.org>
Fri, 13 Feb 2015 02:01:23 +0000 (21:01 -0500)
committerColin Walters <walters@verbum.org>
Tue, 24 Feb 2015 20:06:35 +0000 (15:06 -0500)
I originally thought this would fix a regression, but it turns out
this wasn't the bug.  But pushing anyways as it's just cleaner.

https://bugzilla.gnome.org/show_bug.cgi?id=743891

src/switchroot/ostree-prepare-root.c

index 193c3bb3ba3b8c2404397f99327fdcd8dbbcb067..f24409f6695caa293ac017a59ee853414413c22d 100644 (file)
@@ -185,14 +185,6 @@ main(int argc, char *argv[])
       exit (EXIT_FAILURE);
     }
 
-  /* Link to the physical root below the deployment root */
-  snprintf (destpath, sizeof(destpath), "%s/sysroot", newroot);
-  if (mount (root_mountpoint, destpath, NULL, MS_BIND, NULL) < 0)
-    {
-      perrorv ("Failed to bind mount %s to '%s'", root_mountpoint, destpath);
-      exit (EXIT_FAILURE);
-    }
-
   /* Link to the deployment's /var */
   snprintf (srcpath, sizeof(srcpath), "%s/../../var", deploy_path);
   snprintf (destpath, sizeof(destpath), "%s/var", newroot);
@@ -220,14 +212,11 @@ main(int argc, char *argv[])
 
   touch_run_ostree ();
 
-  /* Unmount the previous /sysroot now.  Otherwise, we would be
-   * placing our newroot mount on top of an existing mount, and after
-   * we do a switch_root, we would no longer be able to ever unmount
-   * the original mount.
-   */
-  if (umount (root_mountpoint) < 0)
+  /* Move physical root to $deployment/sysroot */
+  snprintf (destpath, sizeof(destpath), "%s/sysroot", newroot);
+  if (mount (root_mountpoint, destpath, NULL, MS_MOVE, NULL) < 0)
     {
-      perrorv ("failed to umount original mount at %s", root_mountpoint);
+      perrorv ("Failed to MS_MOVE %s to '%s'", root_mountpoint, destpath);
       exit (EXIT_FAILURE);
     }